import { BrowserWindow, ipcMain, app, dialog, shell } from "electron";
import { autoUpdater } from "electron-updater";
const path = require("path");
// import os from "os";
// 版本以package.json为基准。
const version = require("../../package.json").version;
// 您的下载地址
const baseUrl = "http://127.0.0.1:25565/";
var Sysarch = null;
let defaultDownloadUrL: string = `${baseUrl}youdi.dmg?${new Date().getTime()}`;
// 识别操作系统位数D
// os.arch().includes("64") ? (Sysarch = "win64") : (Sysarch = "win32");
// 识别操作系统
// linux自己修改后缀名哦，我没有linux就没有测试了
// if (os.platform().includes("win32")) {
//   defaultDownloadUrL =
//     baseUrl + `electron_${version}_${Sysarch}.exe?${new Date().getTime()}`;
// } else if (os.platform().includes("linux")) {
//   defaultDownloadUrL =
//     baseUrl + `electron_${version}_${Sysarch}?${new Date().getTime()}`;
// } else {
//   defaultDownloadUrL =
//     baseUrl + `electron_${version}_mac.dmg?${new Date().getTime()}`;
// }

//处理更新操作
function handleUpdate(mainWindow: BrowserWindow) {
  // 通过main进程发送事件给renderer进程，提示更新信息
  function sendUpdateMessage(text: any) {
    mainWindow.webContents.send("message", text);
  }

  ipcMain.on("checkForUpdate", (event, data) => {
    console.log("执行自动更新检查!!!");
    // event.sender.send('reply', 'hi lee my name is yuan, age is 17');
    autoUpdater.checkForUpdates().catch((err) => {
      console.log("网络连接失败", err);
    });
  });
  const returnData = {
    error: { status: -1, msg: "检测更新查询异常" },
    checking: { status: 0, msg: "正在检查应用程序更新" },
    updateAva: { status: 1, msg: "检测到新版本，正在下载,请稍后" },
    updateNotAva: { status: -1, msg: "您现在使用的版本为最新版本,无需更新!" },
  };

  //   autoUpdater.currentVersion.version = "1.0.0";
  //和之前package.json配置的一样
  autoUpdater.setFeedURL("http://192.168.60.28:7001/p");

  //更新错误
  autoUpdater.on("error", function (error) {
    console.log("更新错误");
    sendUpdateMessage(returnData.error);
  });

  //检查中
  autoUpdater.on("checking-for-update", function () {
    console.log("检查中");
    sendUpdateMessage(returnData.checking);
  });

  //发现新版本
  autoUpdater.on("update-available", function (info) {
    console.log("发现新版本");
    sendUpdateMessage(returnData.updateAva);
  });

  //当前版本为最新版本
  autoUpdater.on("update-not-available", function (info) {
    setTimeout(function () {
      sendUpdateMessage(returnData.updateNotAva);
    }, 1000);
  });

  // 更新下载进度事件
  autoUpdater.on("download-progress", function (progressObj) {
    console.log("更新下载进度事件");
    // mainWindow.webContents.send('downloadProgress', progressObj)
    const winId = BrowserWindow.getFocusedWindow().id;
    let win = BrowserWindow.fromId(winId);
    win.webContents.send("downloadProgress", progressObj);
  });

  autoUpdater.on(
    "update-downloaded",
    function (
      event,
      releaseNotes,
      releaseName,
      releaseDate,
      updateUrl,
      quitAndUpdate
    ) {
      ipcMain.on("isUpdateNow", (e, arg) => {
        //some code here to handle event
        autoUpdater.quitAndInstall();
      });
      // win.webContents.send('isUpdateNow')
    }
  );
}

function dowlandUpdate(mainWindow: BrowserWindow) {
  // 页面调用这个方法
  ipcMain.handle("start-download", (event, msg) => {
    mainWindow.webContents.downloadURL(msg.downloadUrL || defaultDownloadUrL);
    mainWindow.webContents.session.on(
      "will-download",
      (event, item, webContents) => {
        //   将文件保存在系统的下载目录
        const filePath = path.join(
          app.getPath("downloads"),
          item.getFilename()
        );
        // 自动保存
        item.setSavePath(filePath);
        // 下载进度
        item.on("updated", (event, state) => {
          switch (state) {
            case "progressing":
              mainWindow.webContents.send(
                "download-progress",
                (
                  (item.getReceivedBytes() / item.getTotalBytes()) *
                  100
                ).toFixed(0)
              );
              break;
            case "interrupted":
              mainWindow.webContents.send("download-paused", true);
              break;
            default:
              break;
          }
        });
        // 下载完成或失败
        item.once("done", (event, state) => {
          switch (state) {
            case "completed":
              const data = {
                filePath,
              };
              shell.openPath(data.filePath);
              // mainWindow.webContents.send("download-done", data);
              break;
            case "interrupted":
              mainWindow.webContents.send("download-error", true);
              dialog.showErrorBox(
                "下载出错",
                "由于网络或其他未知原因导致客户端下载出错，请前往官网进行重新安装"
              );
              break;
            default:
              break;
          }
        });
      }
    );
  });
}

export { handleUpdate, dowlandUpdate };
